#ifndef HITTABLE_H
#define HITTABLE_H

#include "ray.h"

/**
 * 用于描述命中的信息
 */
class hit_record
{
public:
    point3 p;
    vec3 normal;
    double t;
    bool front_face;
    void set_face_normal(const ray &r, const vec3 &outward_normal)
    {
        front_face = dot(r.direction(), outward_normal) < 0;
        normal = (front_face) ? outward_normal : -outward_normal;
    }
};
// 包含纯虚函数的为抽象类 不能实例化
class hittable
{
public:
    virtual ~hittable() = default;                                                             // 虚析构函数 default 关键字表示编译器会自动生成析构函数的默认实现
    virtual bool hit(const ray &r, double ray_min, double ray_max, hit_record &rec) const = 0; // =0 表示纯虚函数 必须在子类中实现
};
#endif